﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.CapaDominio;
using System.Data.SqlClient;
using Studio7i.CapaPersistencia;

namespace Studio7i.CapaPersistencia.DAO
{
    public class ClienteDAO : IClienteDAO
    {

        // Métodos CRUD
        public Cliente Crear(Cliente clienteACrear)
        {
            string _Sentencia = "INSERT INTO Cliente VALUES(@codigo,@nombre,@email,@fechaNacimiento,@clave)";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteACrear.CoCliente));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", clienteACrear.NoCliente));
                    _Comando.Parameters.Add(new SqlParameter("@email", clienteACrear.TxMail));
                    _Comando.Parameters.Add(new SqlParameter("@fechaNacimiento", clienteACrear.FeNacimiento));
                    _Comando.Parameters.Add(new SqlParameter("@clave", clienteACrear.TxtClave));

                    _Comando.ExecuteNonQuery();
                }
            }
            return clienteACrear;
        }
        public Cliente Obtener(int codigo)
        {
            string _Sentencia = "SELECT CoCliente, NoCliente, TxMail, FeNacimiento, TxClave FROM Cliente WHERE CoCliente=@codigo";
            Cliente clienteCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            clienteCreado = new Cliente();
                            clienteCreado.CoCliente = _Resultado.GetInt32(0); ;
                            clienteCreado.NoCliente = _Resultado.GetString(1);
                            clienteCreado.TxMail = _Resultado.GetString(2);
                            clienteCreado.FeNacimiento = _Resultado.GetString(3);
                            clienteCreado.TxtClave = _Resultado.GetString(4);
                        }
                    }
                }
            }
            return clienteCreado;
        }
        public Cliente Modificar(Cliente clienteAModificar)
        {
            string _Sentencia = "UPDATE Cliente SET NoCliente=@nombre,TxMail=@email,FeNacimiento=@fechaNacimiento,TxClave=@clave WHERE CoCliente=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {

                    _Comando.Parameters.Add(new SqlParameter("@nombre", clienteAModificar.NoCliente));
                    _Comando.Parameters.Add(new SqlParameter("@email", clienteAModificar.TxMail));
                    _Comando.Parameters.Add(new SqlParameter("@fechaNacimiento", clienteAModificar.FeNacimiento));
                    _Comando.Parameters.Add(new SqlParameter("@clave", clienteAModificar.TxtClave));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAModificar.CoCliente));

                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(clienteAModificar.CoCliente);
        }
        public void Eliminar(Cliente clienteAEliminar)
        {
            string _Sentencia = "DELETE FROM Cliente WHERE CoCliente=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAEliminar.CoCliente));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Cliente> ListarTodos()
        {
            string _Sentencia = "SELECT CoCliente, NoCliente, TxMail, FeNacimiento, TxClave FROM Cliente";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CoCliente = _Resultado.GetInt32(0);
                            clienteEncontrado.NoCliente = _Resultado.GetString(1);
                            clienteEncontrado.TxMail = _Resultado.GetString(2);
                            clienteEncontrado.FeNacimiento = (string)_Resultado["FeNacimiento"];
                            clienteEncontrado.TxtClave = _Resultado.GetString(4);
                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }
        public ICollection<Cliente> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT CoCliente, NoCliente, TxMail, FeNacimiento, TxClave FROM Cliente WHERE NoCliente LIKE '%'+@nombre+'%'";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CoCliente = _Resultado.GetInt32(0); ;
                            clienteEncontrado.NoCliente = _Resultado.GetString(1);
                            clienteEncontrado.TxMail = _Resultado.GetString(2);
                            clienteEncontrado.FeNacimiento = _Resultado.GetString(3);
                            clienteEncontrado.TxtClave = _Resultado.GetString(4);
                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }

        public ICollection<Cliente> ListarXBusquedaCliente(int? codigo, string nombres, string email, string fechaNacimiento, string clave)
        {
            string _Sentencia = @"SELECT CoCliente, NoCliente, TxMail, FeNacimiento, TxClave 
                FROM Cliente WHERE 1=1";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND CoCliente=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (nombres != null)
                    {
                        _Sentencia = _Sentencia + " AND NoCliente LIKE '%'+@nombres+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombres", nombres));
                    }
                    if (email != null)
                    {
                        _Sentencia = _Sentencia + " AND TxMail LIKE '%'+@email+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@email", email));
                    }
                    if (fechaNacimiento != null)
                    {
                        _Sentencia = _Sentencia + " AND FeNacimiento=@fechaNacimiento";
                        _Comando.Parameters.Add(new SqlParameter("@fechaNacimiento", fechaNacimiento));
                    }
                    if (clave != null)
                    {
                        _Sentencia = _Sentencia + " AND TxClave LIKE '%'+@clave+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@clave", clave));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CoCliente = _Resultado.GetInt32(0); ;
                            clienteEncontrado.NoCliente = _Resultado.GetString(1);
                            clienteEncontrado.TxMail = _Resultado.GetString(2);
                            clienteEncontrado.FeNacimiento = _Resultado.GetString(3);
                            clienteEncontrado.TxtClave = _Resultado.GetString(4);
                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }
    }
}